def bitonic_sort(arr, low, high, dir):
    # 如果子序列长度大于1
    if low < high:
        # 找到子序列的中点
        mid = (low + high) // 2
        
        # 对左右两半分别进行双调排序，方向相反
        bitonic_sort(arr, low, mid, True)
        bitonic_sort(arr, mid + 1, high, False)
        
        # 合并两个有序的双调子序列
        for i in range(low, mid + 1):
            for j in range(mid + 1, high + 1):
                # 根据dir判断应该升序还是降序
                if ((arr[j] < arr[i]) == dir):
                    arr[i], arr[j] = arr[j], arr[i]

def bitonic_sort_seq(arr):
    # 获取数组长度
    n = len(arr)
    
    # 构建完全的双调序列，初始阶段先升序排列
    bitonic_sort(arr, 0, n - 1, True)
    
    # 通过多次翻转，使整个序列最终有序
    k = 1
    while k < n:
        # 控制每次翻转的步长
        k *= 2
        
        # 从大到小反转子序列
        for i in range(0, n - k, 2 * k):
            bitonic_sort(arr, i, min(i + k - 1, n - 1), False)

# 使用示例
arr = [5, 3, 7, 6, 2, 8, 1, 4]
bitonic_sort_seq(arr)
print("Sorted array:", arr)